﻿<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <h2>测试其它类型如何转换为number</h2>
    <p>测试结果如下：</p>
    <ul>
        <li>所有类型都可以隐式的转换为number。</li>
        <li>string的转换规则可以参考javascript语言规范。</li>
        <li>parseFloat可以对字符串进行显式的类型转换，parseInt也可以，转换规则可以参考javascript语言规范。</li>
        <li>boolean的转换规则为：true转换为1，false转换为0。</li>
        <li>object的转换规则为：如果object有valueOf方法，就会使用valueOf的返回结果进行转换，否则使用toString的结果进行转换。</li>
        <li>如果object的valueOf或toString返回的是另外一个object，则转换为NaN，说明不支持递归。</li>
    </ul>
</body>
</html>
<script type="text/javascript">
    console.log('string->number：implicit');
    console.log('100.5' * 1.0);
    console.log('100.5xxx' * 1.0);
    console.log('xxx' * 1.0);

    console.log('string->number：parseFloat');
    console.log(parseFloat('100.5'));
    console.log(parseFloat('100.5xxx'));
    console.log(parseFloat('xxx'));

    console.log('boolean->number：implicit');
    console.log(true * 1.0);
    console.log(false * 1.0);

    console.log('object->number：implicit');
    console.log({ valueOf: function () { return '100.5' } } * 1.0);
    console.log({ valueOf: function () { return '100.5xxx' } } * 1.0);
    console.log({ valueOf: function () { return 'xxx' } } * 1.0);

    console.log({ toString: function () { return '100.5' } } * 1.0);
    console.log({ toString: function () { return '100.5xxx' } } * 1.0);
    console.log({ toString: function () { return 'xxx' } } * 1.0);

    console.log(({
        toString: function () { return '200' },
        valueOf: function () { return '100' }
    }) * 1.0);

    console.log('不支持递归');
    console.log(({
        valueOf: function () {
            return {
                valueOf: function () { return '100.5' }
            };
        }
    }) * 1.0);
</script>
